package data;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import util.ConnectionManager;

import domain.Proyecto;
import domain.Tarea;

public class JDBCProyectoDao implements IProyectoDao{
	
	
	public List<Proyecto> selectAllPublicados(){
		java.sql.Date fechaActual = new java.sql.Date((new java.util.Date()).getTime());//Obtener la fecha actual del sistema
		String where = "FECHAFIN >= '"+fechaActual+"' AND PUBLICADO = "+ 1 ;		
		return selectAllWhere(where);
		
		
	}
	
	public List<Proyecto> selectAllDeEmpresaPublica(int idEmpresa){
		
		java.sql.Date fechaActual = new java.sql.Date((new java.util.Date()).getTime());//Obtener la fecha actual del sistema
		String where = "FECHAFIN >= '"+fechaActual+"' AND PUBLICADO = 0 AND EPID =" +idEmpresa;
		
		return selectAllWhere(where);
	}
	
	public boolean insertProyecto(Proyecto p){
		//JDBCTareaDao tarea = new JDBCTareaDao();
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		
		boolean ret = true;

		try{
			String sql = "INSERT INTO PROYECTO (EPID,DESCRIPCION,FECHAFIN,NOMBRE) VALUES (?,?,?,?);";
			
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			//System.out.println(p.getEpId());
			
			sentencia.setInt(1,p.getEpId());
			sentencia.setString(2, p.getDescripcion());
			sentencia.setDate(3, p.getFechaFin());
			sentencia.setString(4, p.getNombre());
			sentencia.executeUpdate();
			
		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			//e.printStackTrace();
			ret = false;
		} catch (Exception e) {
			System.out.println("Se ha producido al insertar un proyecto");
			ret = false;
			//e.printStackTrace();
		} finally {
			
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar la sentencia de insertar un proyecto");
				ret = false;
				//e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return ret;
	}

	public Proyecto selectProyecto(int idProyecto) {
		Proyecto proyecto= new Proyecto();
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		ResultSet rs = null;
		
		String sql = "SELECT * FROM PROYECTO WHERE ID = '"+idProyecto+"'";
		try{
			
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			rs = sentencia.executeQuery();
			if(rs.next()){
				
				proyecto.setId(rs.getInt("ID"));
				proyecto.setDescripcion(rs.getString("DESCRIPCION"));
				proyecto.setEpId(rs.getInt("EPID"));
				proyecto.setNombre(rs.getString("NOMBRE"));
				proyecto.setFechaFin(rs.getDate("FECHAFIN"));
				
			}
			
		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			//e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Se ha producido al seleccionar un proyecto");
			//e.printStackTrace();
		} finally {
			try {
				rs.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar el resulset de seleccionar un proyecto");
				//e.printStackTrace();
			}
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar la sentencia de seleccionar un proyecto");
				//e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return proyecto;
	}
	
	private List<Proyecto> selectAllWhere(String where){
		List<Proyecto> lista= null;
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM PROYECTO WHERE "+where;
		try{
			lista = new LinkedList<Proyecto>();
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			rs = sentencia.executeQuery();
			while(rs.next()){
				Proyecto temp = new Proyecto();
				temp.setId(rs.getInt("ID"));
				temp.setDescripcion(rs.getString("DESCRIPCION"));
				temp.setEpId(rs.getInt("EPID"));
				temp.setNombre(rs.getString("NOMBRE"));
				temp.setFechaFin(rs.getDate("FECHAFIN"));
				lista.add(temp);
			}
			
		} catch (SQLException e) {
			 System.out.println("Message: " + e.getMessage());
	            System.out.println("SQLState: " + e.getSQLState());
	            System.out.println("ErrorCode: " + e.getErrorCode());
			//e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Se ha producido al seleccionar "+where);
			//e.printStackTrace();
		} finally {
			try {
				rs.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar el resulset de seleccionar "+where);
				//e.printStackTrace();
			}
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar la sentencia de seleccionar "+where);
				//e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return lista;
	}

	public boolean publicarProyecto(int pid) {
		ConnectionManager cm = ConnectionManager.getInstance();
		Connection con = (Connection) cm.checkOut();
		PreparedStatement sentencia = null;
		
		boolean ret = true;

		try{
			String sql = " UPDATE PROYECTO SET PUBLICADO = ?  WHERE id = ?";
			
			sentencia = (PreparedStatement) con.prepareStatement(sql);
			
			sentencia.setBoolean(1,true);
			sentencia.setInt(2,pid);
			sentencia.executeUpdate();
			
			
		} catch (SQLException e) {
			System.out.println("Se ha producido un error en la base de datos");
			//e.printStackTrace();
			ret = false;
		} catch (Exception e) {
			System.out.println("Se ha producido al publicar un proyecto");
			ret = false;
			//e.printStackTrace();
		} finally {
			
			try {
				sentencia.close();
			} catch (SQLException e) {
				System.out.println("Fallo al cerrar la sentencia de publicar un proyecto");
				ret = false;
				//e.printStackTrace();
			}
			cm.checkIn(con);
		}
		return ret;
	}

}
